package com.wl.cloud.system.security;

import com.wl.cloud.security.service.DynamicSecurityService;
import com.wl.cloud.system.dao.SysResourceMapper;
import com.wl.cloud.system.dao.SysRoleMapper;
import com.wl.cloud.system.dao.SysRoleResourceMapper;
import com.wl.cloud.system.support.utils.ConstantSystem;
import com.wl.cloud.system.support.vo.InitSysResourceVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author: wanglin
 * @date: 2023-09-12 周二
 * @Version: 1.0
 * @Description:
 */
@Slf4j
public class DynamicSecurityServiceImpl implements DynamicSecurityService {
    @Autowired
    private SysResourceMapper resourceMapper;
    @Autowired
    private SysRoleResourceMapper roleResourceMapper;
    @Autowired
    private SysRoleMapper roleMapper;

    @Value(ConstantSystem.PROJECT_URL_PREFIX)
    private String projectUrlPrefix;


    //    @Override
//    public Map<String, ConfigAttribute> loadDataSource() {
//        Map<String, ConfigAttribute> map = new ConcurrentHashMap<>(16);
//        //map.put("/cloud/hp/api/v101/user/page", new SecurityConfig("ADMIN"));
//
//        //允许访问登录之后，访问没有配置角色的资源路径，如：登录之后需要访问getInfo,getRoutes，但这个写接口不需要配置给角色，默认都有的
//        //从数据库中获取所有访问资源路径
//        log.info("sys:loading all system resources.....");
//        List<SysResource> allResourceList = resourceMapper.selectList(null);
//        Assert.notEmpty(allResourceList, "系统资源数据为空，请联系管理员！！！");
////        if (CollectionUtils.isEmpty(allResourceList)) {
////            return map;
////        }
//        List<SysResource> resourceUrlList = allResourceList.stream().filter(e -> StringUtils.isNotBlank(e.getUrl())).collect(Collectors.toList());
//        Assert.notEmpty(resourceUrlList, "没有可访问的系统资源，请联系管理员！！！");
////        if (CollectionUtils.isEmpty(resourceUrlList)) {
////            return map;
////        }
//        Map<String, String> allUrlByIdMap = resourceUrlList.stream().collect(Collectors.toMap(SysResource::getId, SysResource::getUrl));
//        if (MapUtils.isNotEmpty(allUrlByIdMap)) {
//            //获取所有的角色
//            log.info("sys:loading all roles in the system.....");
//            Map<String, String> allRoleByIdMap = roleMapper.selectList(new LambdaQueryWrapper<SysRole>().eq(SysRole::getStatus, NumberUtils.INTEGER_ZERO)).stream().collect(Collectors.toMap(SysRole::getId, SysRole::getCode));
//            Assert.notNull(allRoleByIdMap, "系统访问角色为空，请联系管理员！！！");
//            log.info("sys:all roles: {}", allRoleByIdMap.values());
//            if (!allRoleByIdMap.isEmpty()) {
//                //获取所有的资源对应的角色
//                log.info("获取所有资源对应的角色.....");
//                List<SysRoleResource> roleResourceList = roleResourceMapper.selectList(null);
//                // Assert.isTrue(CollectionUtils.isNotEmpty(roleResourceList), "访问系统资源路径对应的角色为空，请联系管理员！！！");
//                if (CollectionUtils.isNotEmpty(roleResourceList)) {
//                    //添加访问路径的权限
//                    roleResourceList.stream().forEach(e -> {
//                        if (StringUtils.isNotBlank(allUrlByIdMap.get(e.getResourceId()))) {
//                            if (StringUtils.isNotBlank(allRoleByIdMap.get(e.getRoleId()))) {
//                                map.put(ConstantSystem.PROJECT_URL_PREFIX + allUrlByIdMap.get(e.getResourceId()), new SecurityConfig(allRoleByIdMap.get(e.getRoleId())));
//                            }
//                        }
//                    });
//                }
//            }
//        }
//        return map;
//    }
    @Override
    public Map<String, ConfigAttribute> loadDataSource() {
        //map.put("/cloud/hp/api/v101/user/page", new SecurityConfig("ADMIN"));
        Map<String, ConfigAttribute> map = new ConcurrentHashMap<>(16);

        //允许访问登录之后，访问没有配置角色的资源路径，如：登录之后需要访问getInfo,getRoutes，但这个写接口不需要配置给角色，默认都有的, 从数据库中获取所有访问资源路径
        List<InitSysResourceVO> resourceUrlList = resourceMapper.getInitSysResourceList();
        Assert.notEmpty(resourceUrlList, "没有可访问的系统资源，请联系管理员！！！");

        //添加访问路径的权限
        resourceUrlList.stream().forEach(e -> {
            if (!StringUtils.isEmpty(e.getRoleType())) {
                //可能对应多个角色，如:test1,COMMON
                map.put(projectUrlPrefix + e.getUrl(), new SecurityConfig(e.getRoleType()));
            }
        });
        return map;
    }
}
